#include "mySort.h"
#include <iostream>
#include <string>

//默认构造函数
MySort::MySort():num(0),origin(nullptr){}

//带参构造函数
MySort::MySort(int n, int* arr):num(n){
    origin=new int[num];
    for(int i=0;i<num;i++)
    {
        origin[i]=arr[i];
    }
}

//析构函数
MySort::~MySort(){
    delete[] origin;
}

//将整数a和b进行交换的辅助函数
void MySort::changeSwap(int& a, int& b){
    int temp=a;
    a=b;
    b=temp;
}

//输出当前数组的字符串形式
string MySort::printNum(){
    string result;
    for(int i=0;i<num-1;++i)
    {
        result+=to_string(origin[i])+" ";
    }
    result+=to_string(origin[num-1]);
    result+="\n";
    return result;
}

//奇偶交换排序
string MySort::paritySort(){
    string output;
    bool swapped;   //标志是否发生交换
    int flag=1;
    int k=1;
    while(1)
    {
        swapped=false;      //循环开始时swapped交换标志初始化为false
        //奇数位置的比较
        for(int i=k;i<num-1;i+=2)
        {
            if(origin[i]>origin[i+1])
            {
                changeSwap(origin[i+1],origin[i]);
                swapped=true;
                output+=printNum();     //记录当前状态
            }
        }
        if(swapped==0&&flag==0)
        {
            return output;
        }
        else
        {
            flag=swapped;
            k=(k+1)%2;
        }
    }
}

//双向冒泡排序
string MySort::bubbleSort(){
    string output;
    bool swapped;       //标志是否发生交换
    for(int i=0;i<num;++i)
    {
        swapped=false;
        //从左到右的比较
        for(int j=0;j<num-1-i;++j)
        {
            if(origin[j]>origin[j+1])
            {
                changeSwap(origin[j],origin[j+1]);
                swapped=true;
                output+=printNum();
            }
        }

        //从右到左的比较
        for(int j=num-1-i;j>0;--j)
        {
            if(origin[j]<origin[j-1])
            {
                changeSwap(origin[j],origin[j-1]);
                swapped=true;
                output+=printNum();
            }
        }
        if(!swapped)    break;      //若为发生交换，说明已经排好序
    }
    return output;
}
